﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using DevComponents.DotNetBar.Metro;
using ProductManagement.Ultilities;

namespace ProductManagement.Forms
{
    public partial class ImportForm : MetroForm
    {
        #region Các trường

        /// <summary>
        /// ID của báo cáo mà MainForm truyền vào
        /// </summary>
        private int _rid;
        /// <summary>
        /// Đối tượng liên kết dữ liệu LinQ to SQL, để thao tác với cơ sở dữ liệu
        /// </summary>
        private ProductManagementClassesDataContext db = new ProductManagementClassesDataContext();
        /// <summary>
        /// Đối tượng kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        private Validator validator = new Validator();
        /// <summary>
        /// MainForm gọi tới form này
        /// </summary>
        private MainForm _mainForm;

        #endregion

        #region Hàm khởi tạo

        /// <summary>
        /// Hàm khởi tạo không tham số
        /// </summary>
        public ImportForm()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Hàm khởi tạo 2 tham số
        /// </summary>
        /// <param name="reportId">ID của báo cáo nhập sản phẩm</param>
        /// <param name="mainForm">MainForm gọi tới form này</param>
        public ImportForm(int reportId, MainForm mainForm)
        {
            _rid = reportId;
            _mainForm = mainForm;
            InitializeComponent();
        }

        #endregion

        #region Các phương thức khác

        /// <summary>
        /// Kiểm tra tính hợp lệ của số lượng nhập sản phẩm
        /// </summary>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        private bool ValidateImportQuantity()
        {
            if (validator.ValidateQuantity(txtImportQuantity, errorProvider1))
            {
                if (Int32.Parse(txtImportQuantity.Text) == 0)
                {
                    errorProvider1.SetError(txtImportQuantity, "Số lượng sản phẩm phải lớn hơn 0!");
                    return false;
                }
                else
                    return true;
            }
            else
                return false;
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của dữ liệu nhập vào
        /// </summary>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        private bool ValidateImportData()
        {
            bool isValidName = validator.ValidateName(txtImportName, errorProvider1);
            bool isValidPrice = validator.ValidatePrice(txtImportPrice, errorProvider1);
            bool isValidQuantity = ValidateImportQuantity();
            bool isValidYear = validator.ValidateYear(txtImportYear, errorProvider1);
            return (isValidName && isValidPrice && isValidQuantity && isValidYear);
        }

        /// <summary>
        /// Xóa các trường text, xóa báo lỗi
        /// </summary>
        private void ResetTextFields()
        {
            txtImportName.ResetText();
            txtImportPrice.ResetText();
            txtImportQuantity.ResetText();
            txtImportYear.ResetText();
            txtImportName.Focus();
            errorProvider1.Dispose();
        }

        #endregion

        #region Xử lý sự kiện

        /// <summary>
        /// Sự kiện nhấn nút Thêm (Nhập thêm một sản phẩm)
        /// </summary>
        private void btnAddImport_Click(object sender, EventArgs e)
        {
            //Nếu dữ liệu hợp lệ
            if (ValidateImportData())
            {
                DialogResult dr = MessageBoxEx.Show("Bạn có muốn nhập sản phẩm này?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr == DialogResult.Yes)
                {
                    int productID;
                    string name = txtImportName.Text;
                    decimal price = Decimal.Parse(txtImportPrice.Text);
                    int quantity = Int32.Parse(txtImportQuantity.Text);
                    int year = Int32.Parse(txtImportYear.Text);
                    string state = (quantity > 0) ? "Còn hàng" : "Hết hàng";
                    //Kiểm tra sản phẩm có tồn tại trong cơ sở dữ liệu hay không
                    var count = db.sp_IsExistProduct(name, price, year).SingleOrDefault();
                    //Nếu đã có sản phẩm này trong cơ sở dữ liệu
                    if (count.dem != 0)
                    {
                        //Lấy ID của sản phẩm trong cơ sở dữ liệu
                        int oldProductID = db.sp_GetProductID(name, price, year).SingleOrDefault().id;
                        productID = oldProductID;
                        //Lấy số lượng cũ của sản phẩm trong cơ sở dữ liệu
                        int oldQuantity = db.sp_GetProductQuantity(oldProductID).SingleOrDefault().quantity;
                        //Cập nhật số lượng mới của sản phẩm : số lượng cũ + số lượng nhập
                        db.sp_UpdateProductQuantity(oldQuantity + quantity, oldProductID);
                    }
                    //Nếu chưa có sản phẩm này trong cơ sở dữ liệu
                    else
                    {
                        //Thêm sản phẩm mới vào cơ sở dữ liệu
                        db.sp_InsertProduct(name, price, quantity, year, state);
                        //Lấy ID của sản phẩm mới
                        productID = (int)db.sp_GetProductID(name, price, year).SingleOrDefault().id;
                    }
                    //Thêm chi tiết báo cáo vào cơ sở dữ liệu
                    db.sp_InsertReportDetail(_rid, name, price, quantity);
                    _mainForm.DisplayExportImportInfo(_rid);
                    MessageBoxEx.Show("Nhập sản phẩm thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    db.SubmitChanges();
                    ResetTextFields();
                }
            }
        }

        /// <summary>
        /// Sự kiện nhấn nút Nhập lại (Xóa các trường text để người dùng nhập lại thông tin sản phẩm)
        /// </summary>
        private void btnResetImport_Click(object sender, EventArgs e)
        {
            ResetTextFields();
        }

        /// <summary>
        /// Sự kiện nhấn nút OK (thoát form Nhập sản phẩm)
        /// </summary>
        private void btnOK_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// <summary>
        /// Sự kiện thoát form Nhập sản phẩm
        /// </summary>
        private void ImportForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            //Nếu báo cáo nhập sản phẩm (được tạo khi gọi form này) không chứa chi tiết báo cáo nào
            //thì xóa báo cáo khỏi cơ sở dữ liệu
            int count = (int)db.sp_GetReportDetailsCount(_rid).SingleOrDefault().dem;
            if (count == 0)
                db.sp_DeleteReport(_rid);
            db.SubmitChanges();
        }

        #endregion
    }
}
